package com.lq.learningTest.AnnotationTest;

import java.io.File;
import java.net.URL;
import java.util.List;

public class Bootstrap {
    // 静态代码块，类加载之后就会处理
    static {
        // 获取当前线程的上下文类加载器，从中获取classpath根路径
        final URL resource = Thread.currentThread().getContextClassLoader().getResource("");

        // 使用工具类方法，递归获取resource路径下所有类的全限定名
        List<String> classNames = FileUtils.getAllClassName(new File(resource.getFile()));

        // 扫描并处理有@Singleton注解的类，创建其实例并注册进ApplicationContext
        SingletonHandler.handler(classNames);
    }

    /**
     * 在我们工程中不可靠所有的类都保留有状态（这里的状态指的是实例的成员变量不同），对于无状态也就是只有成员方法的类，我们只是用实列的成员
     * 方法，完全没有必要实现若干个实例，这里我们就使用单例的形式。
     * 不同的是，我们使用注解的形式来标记进行单例的类
     * 注解本身不能做什么工作，但是通过反射的解析就能让某一个类赋予一些能力（而这个能力比如说这里的单例为例，就是我们赋予这个注解的能力）
     */
    public static void main(String[] args) {
        // 从IOC容器中获取Dog类的单例对象
        Dog singleton = ApplicationContext.getSingleton(Dog.class);
        System.out.println(singleton);// 打印Dog实例，调用toString方法
    }
}
